<html>
<head>
  <title>0-1.模式对比</title>
  <basefont face="微软雅黑" size="2" />
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  <meta name="exporter-version" content="YXBJ Windows/602628 (zh-CN, DDL); Windows/10.0.0 (Win64); EDAMVersion=V2;"/>
  <style>
    body, td {
      font-family: 微软雅黑;
      font-size: 10pt;
    }
  </style>
</head>
<body>
<a name="28104"/>
<h1>0-1.模式对比</h1>
<div>
<table bgcolor="#D4DDE5" border="0">
<tr><td><b>创建时间：</b></td><td><i>2020/12/2 6:07</i></td></tr>
<tr><td><b>更新时间：</b></td><td><i>2021/1/31 7:00</i></td></tr>
<tr><td><b>作者：</b></td><td><i>YuGe</i></td></tr>
</table>
</div>
<br/>

<div>
<span><div><div><span style="font-size: 16px;"><span style="font-size: 16px; font-weight: bold;">工厂方法模式 vs. 抽象工厂模式</span></span></div><div><span style="font-size: 16px;"><span style="font-size: 16px; font-weight: bold;">联系</span></span></div><ul><li><div><span style="font-size: 16px;">抽象工厂的每个方法实际上看起来都像是工厂方法。每个方法都被声明成抽象，而子类的方法覆盖这些方法来创建某些对象。</span></div><div><span style="font-size: 12pt; color: unset; font-family: unset;">抽象工厂的方法经常以工厂方法的方式实现。抽象工厂的任务是定义一个负责创建一组产品的接口，这个接口内的每个方法都负责创建一个具体产品，同时我们利用实现抽象工厂的子类来提供这些具体的做法。所以，在抽象工厂中利用工厂方法实现生产方法是相当自然的做法。</span></div><div><span style="font-size: 12pt; color: unset; font-family: unset;">抽象工厂</span><span style="font-size: 12pt; color: unset; font-family: unset;">的具体工厂经常实现工厂方法来创建他们的产品。对</span><span style="font-size: 12pt; color: unset; font-family: unset;">抽象工厂</span><span style="font-size: 12pt; color: unset; font-family: unset;">来说，这些具体工厂纯粹只是用来创建产品罢了。</span></div><div><span style="font-size: 12pt; color: unset; font-family: unset;">【观察在家族中的一个具体的产品，都是使用工厂方法】</span></div></li><li><div><span style="font-size: 16px;">工厂方法与抽象工厂都能将对象的创建封装起来，使应用程序解耦，并降低其对特定实现的依赖。</span></div></li></ul><div><span style="font-size: 16px;"><span style="font-size: 16px; font-weight: bold;">区别</span></span></div><ul><li><div><span style="font-size: 16px;">工厂方法使用的是类，抽象工厂使用的是对象</span></div><div><span style="font-size: 12pt;">抽象工厂与</span><span style="font-size: 16px;">工厂方法</span><span style="font-size: 12pt;">都是负责创建对象，</span><span style="font-size: 12pt;">但是：</span></div><div><span style="font-size: 16px;">工厂方法使用</span><span style="font-size: 12pt;">继承创建对象，把对象的创建委托给子类，子类实现工厂方法来创建对象。</span></div><div><span style="font-size: 12pt;">抽象工厂是通过对象的组合创建对象，对象的创建被实现在工厂接口所暴露出来的方法中。</span></div></li><li><div><span style="font-size: 16px;">实现方式不同</span></div><div><span style="font-size: 12pt;">利用工厂方法创建对象，需要扩展一个类，并覆盖它的工厂方法。</span></div><div><span style="font-size: 12pt;">抽象工厂提供一个用来创建一个产品家族的抽象类型，这个类型的子类定义了产品被产生的方法。要想使用这个工厂，必须先实例化它，然后将它传入一些针对抽象类型所写的代码中。所以，和工厂方法一样，</span><span style="font-size: 12pt;">抽象工厂</span><span style="font-size: 12pt;">可以把客户从所使用的实际具体产品中解耦。</span><span style="font-size: 12pt;">抽象工厂</span><span style="font-size: 12pt;">另一个优点是可以把一群相关的产品集合起来。</span></div></li><li><div><span style="font-size: 16px;">接口复杂性不同</span></div><div><span style="font-size: 12pt;">工厂方法</span><span style="font-size: 12pt;">是创建一个产品，所以</span><span style="font-size: 12pt;">工厂方法</span><span style="font-size: 12pt;">根本不需要一个大的接口，只需要一个方法就可以了。</span></div><div><span style="font-size: 12pt;">抽象工厂</span><span style="font-size: 12pt;">需要一个大的接口，因为</span><span style="font-size: 12pt;">抽象工厂</span><span style="font-size: 12pt;">可是被用来创建整个产品家族的。需要扩展这组相关产品（如新增一个产品），就必须改变接口。</span></div></li><li><div><span style="font-size: 16px;">工厂方法提供一个抽象接口来创建“一个产品”，由每个子类来决定实例化哪个具体类。</span></div><div><span style="font-size: 16px;">抽象工厂提供一个抽象接口用来创建一个产品家族，每个具体子类都创建一个家族的产品，这些负责在抽象工厂中创建产品的方法，通常是以“工厂方法”来实现的，这些产品子类创建了一组平行的产品家族。</span></div></li><li><div><span style="font-size: 16px; color: unset; font-family: unset; font-weight: bold;">应用</span></div></li><ul><li><div><span style="font-size: 12pt;">抽象工厂：当需要创建产品家族和想让制造的相关产品集合起来时，可以使用</span></div></li><li><div><span style="font-size: 12pt;">工厂方法：可以把客户代码从需要实例化的具体类中解耦。或者如果目前还不知道将来需要实例化哪些具体类时，也可以用</span><span style="font-size: 12pt;">工厂方法</span><span style="font-size: 12pt;">。</span><span style="font-size: 12pt;">工厂方法</span><span style="font-size: 12pt;">的使用方式很简单，只要</span><span style="font-size: 12pt;">继承抽象的Creator，并实现</span> <span style="font-size: 16px; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: rgb(0, 0, 0); font-family: 微软雅黑; font-variant-caps: normal; font-variant-ligatures: normal;">Creator</span><span style="font-size: 12pt;">的工厂方法就可以了。</span></div></li></ul></ul><div><br clear="none"/></div><div><span style="font-size: 12pt; font-weight: bold;">策略模式 vs. 状态模式</span></div><div><font style="font-size: 12pt;"><span style="font-size: 12pt; font-weight: bold;">联系</span></font></div><ul><li><div><span style="font-size: 16px;">类图一样</span></div></li></ul><div><span style="font-size: 16px;"><span style="font-size: 16px; font-weight: bold;">区别</span></span></div><ul><li><div><span style="font-size: 16px;">意图不同</span></div></li><ul><li><div><span style="font-size: 16px;">状态模式</span></div><div><span style="font-size: 12pt;">我们将一群行为封装在状态对象中， context的行为随时可委托到那些状态对象中的一个。随着时间的流逝，当前状态在状态对象集合中游走改变，以反映出 context内部的状态，因此， context的行为也会跟着改变。但是 context的客户对于状态对象了解不多，甚至根本是浑然不觉。</span></div><div><span style="font-size: 12pt;">我们把状态模式想成是不用在 context中放置许多条件判断的替代方案。通过将行为包装进状态对象中，你可以通过在 context内简单地改变状态对象来改变 context的行为。</span></div></li><li><div><span style="font-size: 16px;">策略模式</span></div><div><span style="font-size: 12pt;">客户通常主动指定 Context所要组合的策略对象是哪一个。现在，固然策略模式让我们具有弹性，能够在运行时改变策略，但对于某个 context对象来说，通常都只有一个最适当的策略对象。</span></div><div><span style="font-size: 12pt;">一般来说，我们把策略模式想成是除了继承之外的一种弹性替代方案。如果你使用继承定义了一个类的行为，你将被这个行为困住，甚至要修改它都很难。有了策略模式，你可以通过组合不同的对象来改变行为。</span></div></li></ul></ul><div><font style="font-size: 12pt;"><br clear="none"/></font></div><div><font style="font-size: 12pt;"><b>代理模式 vs. 策略模式</b></font></div><div><font style="font-size: 12pt;"><b>联系</b></font></div><div><font style="font-size: 12pt;"><b>区别</b></font></div><ul><li><div><span style="font-size: 16px;">目的不同</span></div><div><span style="font-size: 16px;">装饰者模式为对象增加行为</span></div><div><span style="font-size: 16px;">代理模式控制对象的访问</span></div></li></ul><div><font style="font-size: 12pt;"><br clear="none"/></font></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div></div><div><br/></div></span>
</div></body></html> 